SQL 注入是一種網絡攻擊,它利用 SQL 查詢中糟糕的輸入驗證。如果應用程序在對數據庫的 SQL 查詢中使用不受信任的用戶輸入,那么故意格式錯誤的用戶輸入可能會修改查詢。SQL 注入攻擊可用于訪問、修改或刪除數據庫中的數據。
如何執(zhí)行 SQL 注入攻擊
基于用戶輸入執(zhí)行 SQL 查詢的應用程序可能容易受到 SQL 注入攻擊。例如,Web 應用程序可以使用 SQL 查詢來實現身份驗證過程。用戶提供他們的用戶名,應用程序使用該用戶名來查找該用戶帳戶的密碼哈希。如果用戶提供的密碼的哈希與此密碼哈希匹配,則用戶成功驗證并獲得對其帳戶的訪問權限。
如果 Web 應用程序在將用戶名包含在 SQL 查詢中之前未對其執(zhí)行驗證,則程序可能會誤解故意格式錯誤的用戶名。例如,SQL 查詢通常使用單引號 (') 或雙引號 (") 來表示命令中的數據。例如,根據用戶名 user 在數據庫中查找客戶記錄的命令可能是SELECT * FROM customers WHERE username=”user” 。
對他的命令執(zhí)行 SQL 注入攻擊的攻擊者可以在他們的輸入中包含一個雙引號字符,以將他們的一些數據解釋為代碼。例如,考慮用戶名user” OR “1”=”1 。
當插入 SQL 查詢時,查詢變?yōu)镾ELECT * FROM customers WHERE username=”user” OR “1”=”1” 。此查詢將返回匹配兩個條件之一的記錄,而不是查找用戶名與用戶提供的值匹配的記錄。第一個是預期的測試username=”user” ,它將返回用戶的記錄。
第二個條件是測試“1”=”1” 。由于這始終是正確的,它將返回數據庫中的所有記錄。這可能允許攻擊者提取有關其他用戶的敏感信息,或者可能允許攻擊者繞過身份驗證或以另一個用戶身份進行身份驗證。
SQL 注入的類型
SQLi 攻擊可用于實現不同的目的,并且可以以多種方式執(zhí)行。SQLi 的三種主要類型包括:
- 帶內 SQLi:帶內 SQLi 攻擊使用相同的媒介(例如 HTTP 請求)來執(zhí)行攻擊并收集結果。兩種常見的入站 SQLi 攻擊形式是基于錯誤的 SQLi 攻擊,它嘗試生成錯誤消息,提供有關用于攻擊的目標數據庫的信息,以及基于聯合的 SQL,它使用 SQL UNION 運算符合并 SQL SELECT陳述。
- 盲 SQLi:在盲 SQLi 攻擊中,攻擊者不會根據他們的請求從服務器接收數據。相反,攻擊者會根據服務器的行為修改他們的攻擊。例如,不同的輸入可能會導致操作成功或失敗,或者影響操作執(zhí)行所需的時間。
- 帶外 SQLi:帶外 SQLi 攻擊通過一種介質執(zhí)行攻擊并通過另一種介質收集數據。這種攻擊依賴于數據庫服務器上某些功能的可用性。例如,攻擊者可以根據是否可以強制數據庫服務器向攻擊者控制的服務器生成 HTTP 或 DNS 請求來衡量 SQLi 攻擊的成功與否。
如何防止 SQLI
SQLi 攻擊在對 SQL 命令使用不受信任的數據時利用了較差的輸入驗證。許多 SQLi 攻擊涉及在用戶輸入中使用意外字符,例如單引號或雙引號。
在 SQL 查詢中包含用戶提供的數據之前執(zhí)行輸入驗證有助于減少 SQLi 攻擊的威脅。例如,應用程序可以將用戶輸入限制為一組特定的字符,例如只允許使用字母數字用戶名,或者阻止某些字符包含在用戶輸入中。然而,輸入驗證雖然很重要,但不足以防止 SQL 注入攻擊。攻擊者可能能夠通過使用意外的字符組合來繞過允許列表或阻止列表來逃避阻止。
出于這個原因,公司還應該在執(zhí)行 SQL 查詢的 Web 應用程序和 API 之前部署Web 應用程序防火墻(WAF),或者理想情況下是Web 應用程序和 API 保護(WAAP)。這些解決方案可以幫助識別和阻止試圖利用 SQLi 和其他針對 Web 應用程序和 API 的攻擊的惡意請求。